home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-11-20 | 4.5 KB | 178 lines | [TEXT/CWIE] |
- // SVAEMove.c
- //
- // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
- // 3.1 updates by Greg Sutton.
- // ©Apple Computer Inc 1995, all rights reserved.
-
- #include "SVAEMove.h"
-
- #include "SVEditAEUtils.h"
- #include "SVEditWindow.h" // for DPtrFromWindowPtr()
- #include "SVAETextUtils.h"
-
- #include "SVAEDelete.h"
- #include "SVAECreate.h"
- #include "SVAEGetData.h"
-
-
- #pragma segment AppleEvent
-
-
- pascal OSErr DoMove(const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefCon)
- {
- #pragma unused(handlerRefCon)
-
- AEDesc directObj = {typeNull, NULL},
- insertHereDesc = {typeNull, NULL},
- resultDesc = {typeNull, NULL};
- OSErr err;
-
- err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
- if (noErr != err) goto done;
-
- err = AEGetParamDesc(theAppleEvent, keyAEInsertHere, typeWildCard, &insertHereDesc);
- if (noErr != err) goto done;
-
- // missing any parameters?
- err = GotRequiredParams(theAppleEvent);
- if (noErr != err) goto done;
-
- err = MoveDesc(&directObj, &insertHereDesc, &resultDesc);
- if (noErr != err) goto done;
-
- err = AddResultToReply(&resultDesc, reply, err);
-
- done:
- if (directObj.dataHandle)
- AEDisposeDesc(&directObj);
- if (insertHereDesc.dataHandle)
- AEDisposeDesc(&insertHereDesc);
-
- return(err);
- }
-
- OSErr MoveTextToken(TextToken* token, AEDesc* insertHereDesc, AEDesc* result)
- {
- TextToken insertAtToken;
- AEDesc dataDesc = {typeNull, NULL},
- insertDesc = {typeNull, NULL},
- propertyDesc = {typeNull, NULL}; // Use to pass no properties
- DescType insertType;
- short numPartial;
- OSErr err;
-
- // Get the data descriptor to insert
- err = GetTextTextProperty(token, &dataDesc);
- if (noErr != err) goto done;
-
- // Get the place to insert it
- err = GetInsertDescFromInsertHere(insertHereDesc, &insertDesc, &insertType);
- if (noErr != err) goto done;
-
- if (typeNull == insertType) // Default to setting the selection in the front window
- err = errAETypeError; // GetWindowSelection(FrontWindow(), &insertAtToken, &oldLength);
- else // Otherwise get a selection from the insertDesc
- err = GetInsertToken(&insertDesc, insertType, &insertAtToken);
-
- if (noErr != err) goto done;
-
- // Sort out any moving onto self scenarios
- // and offsets changing due to deletion of where it was
- switch (TokenWithinToken(token, &insertAtToken, &numPartial))
- {
- case kTokenBefore:
- // Do Nothing
- break;
-
- case kTokenAfter:
- // Balance up for delete
- insertAtToken.tokenOffset -= token->tokenLength;
- break;
-
- case kTokenWithin:
- // tell document 1 of application "7Edit"
- // move first word to last character of first word
- // end tell
- insertAtToken.tokenOffset = token->tokenOffset;
- insertAtToken.tokenLength = 0;
- break;
-
- case kTokenPartialBefore:
- insertAtToken.tokenLength -= numPartial;
- break;
-
- case kTokenPartialAfter:
- insertAtToken.tokenOffset = token->tokenOffset;
- insertAtToken.tokenLength -= numPartial;
- break;
- }
-
- // Delete the text to be moved
- err = DeleteTextToken(token);
- if (noErr != err) goto done;
-
- // Secondly create the text wherever
- err = CreateAtTextToken(cText, &dataDesc, &insertAtToken, &propertyDesc, result);
- if (noErr != err) goto done;
-
- done:
- if (dataDesc.dataHandle)
- AEDisposeDesc(&dataDesc);
-
- return(err);
- }
-
- OSErr MoveTextDesc(AEDesc* textDesc, AEDesc* insertHereDesc, AEDesc* result)
- {
- TextToken aTextToken;
- Size actualSize;
- OSErr err;
-
- if (typeMyText != textDesc->descriptorType)
- return(errAETypeError);
-
- GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
-
- err = MoveTextToken(&aTextToken, insertHereDesc, result);
-
- return(err);
- }
-
- OSErr MoveDesc(AEDesc* aDesc, AEDesc* insertHereDesc, AEDesc* result)
- {
- AEDesc moveDesc = {typeNull, NULL},
- textDesc = {typeNull, NULL};
- OSErr err;
-
- if (typeObjectSpecifier == aDesc->descriptorType)
- err = AEResolve(aDesc, kAEIDoMinimum, &moveDesc);
- else
- err = AEDuplicateDesc(aDesc, &moveDesc);
-
- if (noErr != err) goto done;
-
- switch (moveDesc.descriptorType)
- {
- case typeAEList:
- err = errAETypeError;
- // We can't handle moving more than one item because as
- // soon as one item is moved all the rest of the tokens
- // are likely to have their offsets messed up.
- // No doubt it can be done though…
- break;
-
- default:
- err = AECoerceDesc(&moveDesc, typeMyText, &textDesc);
- if (noErr != err) goto done;
- err = MoveTextDesc(&textDesc, insertHereDesc, result);
- }
-
- done:
- if (moveDesc.dataHandle)
- AEDisposeDesc(&moveDesc);
- if (textDesc.dataHandle)
- AEDisposeDesc(&textDesc);
-
- return(err);
- }
-